Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.06.2016, 21:00
Интересующийся
Отправить личное сообщение для reno4 Посмотреть профиль Найти все сообщения от reno4
 
Регистрация: 11.09.2012
Сообщений: 11

AJAX не модифицирует глобальные и внешние переменные
Допустим, есть глобальная переменная

var j = {};

И есть AJAX запрос
function nnn () {
....
	$.ajax ({
		method: "GET",
		url: "../locale/forms.json",
		dataType: "json",
		error: function (jqxhr, status, errorMsg) {
			console.log("status: " + jqxhr.status + ", " + errorMsg + "; " + jqxhr.responseText);
			console.trace();
			console.dir();
		},
		success: function (data) {
			j["estimates"] = "test";
			console.log ("IN = " + j["estimates"]);
		}
	});
....

Есть еще в той же функции вывод в лог после AJAX

console.log ("AFTER: " + j["estimates"]);

В итоге в логе видим

AFTER: undefined
IN = test

мало того, что последовательность нарушена, так еще и откатывается любое изменение внешней переменной, созданной не в AJAX, после завершения AJAX.

Как можно решить эту проблему? Требуется загрузить с сервера данные в JSON формате в соответствующий объект, чтобы потом МНОГОКРАТНО его использовать.

Последний раз редактировалось reno4, 14.06.2016 в 21:43.
Ответить с цитированием
  #2 (permalink)  
Старый 14.06.2016, 21:39
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

var v = {};
// ...........
v["estimates"] = "test";
Ответить с цитированием
  #3 (permalink)  
Старый 14.06.2016, 21:46
Интересующийся
Отправить личное сообщение для reno4 Посмотреть профиль Найти все сообщения от reno4
 
Регистрация: 11.09.2012
Сообщений: 11

Сообщение от Poznakomlus Посмотреть сообщение
var v = {};
// ...........
v["estimates"] = "test";
В реальности перепробовал множество вариантов и тестов, ничего не помогает. Если внутри AJAX присваиваю переменной любое значение, то это значение не видно снаружи. Ваш вариант я, естественно, тоже пробовал.

Кроме того еще пробовал создавать объект JQuery и затолкать значение в него, но если он не был прицеплен к DOM, то при выходе из AJAX это значение терялось.

У кого какие мысли есть по этому поводу?

Последний раз редактировалось reno4, 14.06.2016 в 21:51.
Ответить с цитированием
  #4 (permalink)  
Старый 15.06.2016, 01:25
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

reno4 не будь инопланетянином
success: function (data) {
console.log(data); // 'этот ответ придет асинхронно по умолчанию, то есть через время
}
Ответить с цитированием
  #5 (permalink)  
Старый 15.06.2016, 01:39
Интересующийся
Отправить личное сообщение для reno4 Посмотреть профиль Найти все сообщения от reno4
 
Регистрация: 11.09.2012
Сообщений: 11

Сообщение от Poznakomlus Посмотреть сообщение
reno4 не будь инопланетянином
success: function (data) {
console.log(data); // 'этот ответ придет асинхронно по умолчанию, то есть через время
}
Вы хотите сказать, что такого способа передать значение из AJAX внешней переменной не существует в принципе??

Но ведь тот же плагин DataTables как-то передает значения из AJAX в свои внешние переменные!
Ответить с цитированием
  #6 (permalink)  
Старый 15.06.2016, 02:15
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

вы просто не хотите понять, что переменная изменится, но через время :-)
так как по умолчанию ajax запросы асинхронны
Цитата:
По умолчанию, все запросы без перезагрузки страницы происходят асинхронно (то есть после отправки запроса на сервер, страница не останавливает свою работу в ожидании ответа). Если вам понадобиться синхронное выполнение запроса, то установите параметр в false. Кроссдоменные запросы и запросы типа "jsonp" не могут выполняться в синхронном режиме.

Имейте ввиду, что выполнение запросов в синхронном режиме может привести к блокировке страницы, пока запрос не будет полностью выполнен.
можете убедиться добавив
async: false,
Ответить с цитированием
  #7 (permalink)  
Старый 15.06.2016, 04:12
Интересующийся
Отправить личное сообщение для reno4 Посмотреть профиль Найти все сообщения от reno4
 
Регистрация: 11.09.2012
Сообщений: 11

Сообщение от Poznakomlus Посмотреть сообщение
вы просто не хотите понять, что переменная изменится, но через время :-)
так как по умолчанию ajax запросы асинхронны

можете убедиться добавив
async: false,
Убедился, спасибо. А как же тогда быть с получением в формате JSON ассоциативного массива, точнее, с записью его в объект-переменную? Не ставить же из-за этого синхронный режим, коряво как-то будет. А процедура, создающая у меня форму на основании этого массива, если не получит своевременно данные, не сможет создать форму. Какие на этот счет есть способы решения, не в курсе?
Ответить с цитированием
  #8 (permalink)  
Старый 15.06.2016, 05:36
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от reno4
процедура, создающая у меня форму на основании этого массива, если не получит своевременно данные, не сможет создать форму

Надо полагать, что в этом случае форма создается по требованию и на время, так значит и создавать ее нужно сразу после запроса, а процедура, это и будет функция success Ajax.
Ответить с цитированием
  #9 (permalink)  
Старый 15.06.2016, 15:30
Интересующийся
Отправить личное сообщение для reno4 Посмотреть профиль Найти все сообщения от reno4
 
Регистрация: 11.09.2012
Сообщений: 11

Сообщение от laimas Посмотреть сообщение
Надо полагать, что в этом случае форма создается по требованию и на время, так значит и создавать ее нужно сразу после запроса, а процедура, это и будет функция success Ajax.
Форм много и каждая из них создается неоднократно. И вы предлагаете мне каждый раз дергать при этом AJAX, нагружая сразу 2 сервера лишними запросами? Умножим это на многотысячное количество пользователей. Получим ощутимые дополнительные тормоза, которых могло бы и не быть.

Я уже рассматривал ваш подход в самом начале и от него пришлось отказаться по указанной выше причине. Нужно именно МНОГОКРАТНОЕ использование полученных данных.
Ответить с цитированием
  #10 (permalink)  
Старый 15.06.2016, 15:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от reno4
Форм много и каждая из них создается неоднократно. И вы предлагаете мне каждый раз дергать при этом AJAX, нагружая сразу 2 сервера лишними запросами?
Меняйте логику, кто же вам запрещает. Я не предлагаю дергать, я вообще не знаю, сколько у вас форм, с какой кучи серверов они запрашиваются, но уж коли так, то почему их не приготовить сразу при загрузке страницы, если уж именно МНОГОКРАТНОЕ использование полученных данных?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глобальные переменные в JS mrbanan Общие вопросы Javascript 17 09.01.2016 12:54
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Callback функция и глобальные переменные drunia85 Events/DOM/Window 5 14.10.2012 03:06
глобальные переменные сайта и js leko Общие вопросы Javascript 8 01.07.2012 10:53
Глобальные переменные kilogram Серверные языки и технологии 3 30.03.2012 15:59